//
// Created by Administrator on 2023-11-29.
//

#ifndef MULTIMODULE_FRAMELESSWINDOW_H
#define MULTIMODULE_FRAMELESSWINDOW_H

#include <QWidget>
#include <QObject>
#include <QApplication>
#include <QPoint>
#include <QRect>
#include <QFile>
class FramelessWindow : public QWidget {
Q_OBJECT

public:
    explicit FramelessWindow(QWidget *parent = 0);

public:
    //鼠标事件监听
    bool eventFilter(QObject *watched, QEvent *event);
    //判断是否在边框拖动区域
    bool isInFrameSection(const QPoint &pos, Qt::WindowFrameSection edge);
    Qt::WindowFrameSection getEdgeSection(const QPoint &pos);
    //设置鼠标在边框时状态
    void setCursorStyle(const QPoint &pos);
    //设置是否可以通过鼠标调整窗口大小
    void setResizeable(bool resizeable = true);
    //判断是否可以通过鼠标调整窗口大小
    bool isResizeable() {
        return m_bResizeable;
    }
    //设置可调整大小区域的宽度，在此区域内，可以使用鼠标调整窗口大小
    void setResizeableAreaWidth(int width = 5);
    //获取可调整大小区域的宽度
    int getResizeableAreaWidth(){
        return m_borderWidth;
    }
    //设置窗口最小宽度
    void setMinWindowWidth(int width);
    //获取窗口最小宽度
    int getMinWindowWidth(){
        return  minWindowWidth;
    }
    //设置窗口最小高度
    void setMinWindowHeight(int height);
    //获取窗口最小高度
    int getMinWindowHeight(){
        return minWindowHeight;
    }
    //是否双击标题
    bool isHeadDBClick(long long timestamp);
    //双击
    virtual void headDBClick();
protected:
    //设置一个标题栏widget，此widget会被当做标题栏对待
    void setTitleBar(QWidget *titlebar);
    //加载字体文件
    void loadFonts(QList<QString> *fontFilePath);
    //加载样式文件
    void loadStyleSheet(QList<QString> *styleFilePath);
private slots:
    void onTitleBarDestroyed();
private:
    bool m_bResizeable;
    int m_borderWidth;
    bool isResizing;
    bool isDragging;
    int minWindowWidth;
    int minWindowHeight;
    QPoint dragStartPosition;
    QRect windowGeometry;
    Qt::WindowFrameSection frameSection;
    long long currentTimeStamp;
    QWidget *m_titlebar;
};

#endif //MULTIMODULE_FRAMELESSWINDOW_H

